package Compilador;

import datos.Datos;
import javax.swing.JOptionPane;

public class Plantilla {

    public static final String nombreClase = "SistemaExperto";
    private static String sentencias = null;
    private static Datos datos = null;
    public static String metodo = "metodo";

    /**
     * Recibe las sentecias condicionales creadas por cada metodo ademas elimina
     * caracteres que puedan causar error
     *
     * @author Cristian
     * @param s Sentecia
     * @return void
     */
    public static void setSentencias(String s) {

        if (!s.startsWith("else{")) {

            s = s.replace('à', 'a');
            s = s.replace('é', 'e');
            s = s.replace('í', 'i');
            s = s.replace('ó', 'o');
            s = s.replace('ú', 'u');


            sentencias = s;
        } else {
            JOptionPane.showMessageDialog(null, "Imposible crear sentencias: solo hay 'SINO'");
        }
    }

    public static String getsentecia() {
        return sentencias;
    }

    /**
     * Recibe los datos y ademas elimina caracteres que puedan causar error
     *
     * @author Cristian
     * @param d datos que son las variables y sus posible valores
     * @return void
     */
    public static void setDatos(Datos d) {

        datos = d;
//********************** Eliminando caracteres no deseados ************************
        for (int i = 0; i < datos.getPosiblesValores().size(); i++) {
            for (int j = 0; j < datos.getPosiblesValores().get(i).size(); j++) {
                datos.getPosiblesValores().get(i).set(j, datos.getPosiblesValores().get(i).get(j).replace("\"", "'"));
                datos.getPosiblesValores().get(i).set(j, datos.getPosiblesValores().get(i).get(j).replace("\\", "|"));

                datos.getPosiblesValores().get(i).set(j, datos.getPosiblesValores().get(i).get(j).replace("à", "a"));
                datos.getPosiblesValores().get(i).set(j, datos.getPosiblesValores().get(i).get(j).replace('é', 'e'));
                datos.getPosiblesValores().get(i).set(j, datos.getPosiblesValores().get(i).get(j).replace('í', 'i'));
                datos.getPosiblesValores().get(i).set(j, datos.getPosiblesValores().get(i).get(j).replace('ó', 'o'));
                datos.getPosiblesValores().get(i).set(j, datos.getPosiblesValores().get(i).get(j).replace('ú', 'u'));

                datos.getPosiblesValores().get(i).set(j, datos.getPosiblesValores().get(i).get(j).replace(" ", ""));
            }

        }

        for (int i = 0; i < datos.getTitulos().length; i++) {
            datos.getTitulos()[i] = datos.getTitulos()[i].replace("\"", "'");
            datos.getTitulos()[i] = datos.getTitulos()[i].replace("\\", "|");
        }

    }

    /**
     * Crea el Codigo fuente generado para compilar la clase
     *
     * @author Cristian
     * @param void
     * @return Codigo fuente completo a compilar
     */
    public static String getCompleto() {

        //********* Creando el Codigo Fuente Completo***************************
        String atributos = crearAtributos();
        String Constructor = crearConstructor();
        String inicio = crearInicioComponentes();
        String accion = crearAccionPerformed();
        String main = crearMain();

        return atributos + "\n\n\n" + Constructor + "\n\n\n" + inicio + "\n\n\n" + accion + "\n\n\n" + main;
    }

    /**
     * Crea atributos de la clase que son los las variables esogidas con sus
     * respectivos valores y crea JCombox que permitiran asignar valores a las
     * varibles para luego dar respuesta
     *
     * @author Cristian
     * @param void
     * @return parte del Codigo fuente
     */
    private static String crearAtributos() {


        String atributos = "import java.awt.event.*;\n"
                + "import javax.swing.UIManager;\n"
                + "import javax.swing.*;\n\n"
                + "class SistemaExperto extends javax.swing.JFrame  implements ActionListener { \n";
        atributos += "private String nombreClase; \n";
        atributos += "private JButton boton1; \n";
        atributos += "private JLabel label; \n";


        if (datos != null) {

            for (int i = 0; i < datos.getTitulos().length; i++) {
                if (!datos.getTitulos()[i].equalsIgnoreCase(datos.getNombreClase())) {
                    atributos += "JComboBox  jCMB" + datos.getTitulos()[i] + " ;\n";
                    atributos += "String  " + datos.getTitulos()[i] + " ;\n";

                }
            }
        }

        return atributos;
    }

    /**
     * Crea el Costructor de la clase
     *
     * @author Cristian
     * @param void
     * @return parte del Codigo fuente
     */
    private static String crearConstructor() {


        String c = "";


        c += " public SistemaExperto() {\n"
                + "        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);\n"
                + "        setLayout(null);\n"
                + " nombreClase = \"" + datos.getNombreClase() + "\";\n"
                + "        inicio();\n"
                + "\n"
                + "        boton1 = new JButton(\"Verificar\");\n"
                + "        boton1.setBounds(10, 100, 100, 30);\n"
                + "        boton1.addActionListener(this);\n"
                + "        add(boton1);\n"
                + "\n"
                + "        label = new JLabel(nombreClase);\n"
                + "        label.setBounds(120, 100, 100, 30);\n"
                + "        add(label);\n"
                + "\n"
                + "    }";

        return c;
    }

    /**
     * Le asigna valores a los JComboBox
     *
     * @author Cristian
     * @param void
     * @return parte del Codigo fuente
     */
    private static String crearInicioComponentes() {
        String ini = "";

        ini += " private void inicio() {\n"
                + "setBounds(200,200," + (((datos.getTitulos().length - 1) * 130) + 20) + ",200);\n"
                + "setResizable(false);\n";


        if (datos != null) {


            int h = 0;
            for (int i = 0; i < datos.getTitulos().length; i++) {

                if (!datos.getTitulos()[i].equalsIgnoreCase(datos.getNombreClase())) {

                    //*********LLenar Dinamicamente los JComboBox
                    ini += "jCMB" + datos.getTitulos()[i] + " = new JComboBox(new String[]{\"" + datos.getPosiblesValores().get(h).get(0) + "\"";
                    for (int j = 1; j < datos.getPosiblesValores().get(h).size(); j++) {

                        ini += ",\"" + datos.getPosiblesValores().get(h).get(j) + "\"";
                    }
                    ini += "}); \n";


                    //********************Asignar tamaño ********************
                    ini += "jCMB" + datos.getTitulos()[i] + ".setBounds(" + ((130 * h) + 10) + ", 40, 120, 30);\n";
                    ini += "add(jCMB" + datos.getTitulos()[i] + ");\n\n";


                    //*****************Añadir Etiqueta**********************************************

                    ini += ""
                            + "JLabel l" + datos.getTitulos()[i] + " = new JLabel(\"" + datos.getTitulos()[i] + "\");\n"
                            + "        l" + datos.getTitulos()[i] + ".setBounds(" + ((130 * h) + 10) + ", 10, 120, 30);\n"
                            + "        add(l" + datos.getTitulos()[i] + ");\n\n";

                    h++;

                } else {
                }

            }


        }
        ini += "}\n";
        return ini;
    }
 /**
     * Crea la accion que debe realizar el boton al ser pulsado, basandose en las sentencias creadas
     *
     * @author Cristian
     * @param void
     * @return parte del Codigo fuente
     */
    private static String crearAccionPerformed() {

        String a = "@Override\n";
        a += "    public void actionPerformed(ActionEvent e) {\n";

        if (datos != null) {

            for (int i = 0; i < datos.getTitulos().length; i++) {
                if (!datos.getTitulos()[i].equalsIgnoreCase(datos.getNombreClase())) {
                    a += datos.getTitulos()[i] + " = jCMB" + datos.getTitulos()[i] + ".getSelectedItem().toString() ;\n";
                }
            }
        }



        a += "\n" + sentencias + "\n";

        a += "    }\n"
                + "";
        return a;
    }
 /**
     * Crea el Main de la clase
     *
     * @author Cristian
     * @param void
     * @return parte del Codigo fuente
     */
    private static String crearMain() {
        String m = "";

        m += ""
                + "public static void main(String[] ar) {\n"
                + "        try {\n"
                + "            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());\n"
                + "        } catch (Exception e) {\n"
                + "        }"
                + ""
                + "        SistemaExperto formulario1 = new SistemaExperto();\n"
                + "        \n"
                + "        formulario1.setVisible(true);\n"
                + "    }\n"
                + "}";
        return m;
    }
}
